package Test.负载均衡;

import java.util.Map;
import java.util.Random;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @Author: kirito
 * @Date: 2025/3/11 19:33
 * @Description: 加权随机
 *  源IP哈希算法（Hash）
 *  最少连接算法（Least Connections）
 */

public class weightRandomDemo {
    // 定义一个服务器及其对应权重值的映射
    private static Map<String, Integer> serverMap = new ConcurrentHashMap<>();

    public static String weightRandom() {
        // 获取服务器数量
        int serverCount = serverMap.size();
        // 如果没有可用服务器，返回null
        if (serverCount == 0) {
            return null;
        }
        int totalWeight = 0;
        // 为避免多线程环境中并发操作导致的错误，在方法内部执行锁操作
        synchronized (serverMap) {
            // 计算所有服务器的总权重
            for (Map.Entry<String, Integer> entry : serverMap.entrySet()) {
                totalWeight += entry.getValue();
            }
        }
        // 生成一个随机数
        int randomWeight = new Random().nextInt(totalWeight);
        // 遍历服务器列表并根据服务器权重值选择相应地址
        for (Map.Entry<String, Integer> entry : serverMap.entrySet()) {
            String serverAddress = entry.getKey();
            Integer weight = entry.getValue();
            randomWeight -= weight;
            if (randomWeight < 0) {
                return serverAddress;
            }
        }
        // 默认返回null
        return null;
    }
}
